function Jacobian = calculate_Jacobian(dl, DH_para, q)

Alpha = DH_para.Alpha;
A = DH_para.A;
D = DH_para.D;
Theta = DH_para.Theta;

a3 = A(3); a4 = A(4);
d1 = D(1); d4 = D(4); d5 = D(5); d6 = D(6);
q1 = q(1); q2 = q(2); q3 = q(3); q4 = q(4); q5 = q(5); q6 = q(6);
d1 = d1 + dl(1); a3 = a3 + dl(2); a4 = a4 + dl(3);
d4 = d4 + dl(4); d5 = d5 + dl(5); d6 = d6 + dl(6);

Jacobian = [ 0, cos(q1)*sin(q2), sin(q2 + q3)*cos(q1), -sin(q1), sin(q2 + q3 + q4)*cos(q1), - cos(q5)*sin(q1) - cos(q2 + q3 + q4)*cos(q1)*sin(q5);
  0, sin(q1)*sin(q2), sin(q2 + q3)*sin(q1),  cos(q1), sin(q2 + q3 + q4)*sin(q1),   cos(q1)*cos(q5) - cos(q2 + q3 + q4)*sin(q1)*sin(q5);
  1,         cos(q2),         cos(q2 + q3),        0,         cos(q2 + q3 + q4),   cos(q2 + q3 + q4 - q5)/2 - cos(q2 + q3 + q4 + q5)/2];